package com.example.first.thread;

import sun.util.locale.provider.JRELocaleProviderAdapter;

/**
 * @Author LSQ
 * @Description 并发编程的3个特性 原子性、可见性、有序性； volatile只保证可见性，不保证原子性
 * @date 2021/8/29 12:37
 * @Version 1.0
 */

public class LearnVolatile2 {

    public static boolean flag = false;
    public volatile static int count = 0;
    public static Object object = new Object();

    public static void myCount() {
        for (int i = 0; i < 1000; i++) {
            // 加上synchronized保证原子性
            synchronized (object) {
                count++;
            }
        }
    }

    public static void main(String[] args) {
        Runnable runnable1 = () -> {
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + " is working...");
            myCount();
        };

        // 定义10个任务，10个任务都对count++
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(runnable1, "Task" + i);
            thread.start();

        }

        // 睡眠3000毫秒，等待任务都执行完成；
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 连续8次都是10000，第9次是9972，并发编程看来没那么好搞；
        // 我怎么才能判断所有的线程都执行完成了；
        // 我加了volatile，为什么还是不管用啊？
        System.out.println("result is " + count);

        // 先要理解JMM，多线程如何加载共享变量
        /**
         * 假设Thead-0 执行count++
         * 1、read
         * 2、load
         * 3、use
         * 4、
         *
         *
         *
         *
         * 完成count++需要3个步骤 读 -> ++ -> 写回；
         * 线程是基于时间片轮询的，CPU时不时切换线程
         * volatile不保证原子性
         */


    }


}
